package com.order.frontend.feginapi.Config;

import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

@Configuration
public class FeignConfig {

    @Bean
    public RequestInterceptor oauth2FeignRequestInterceptor() {
        //// 编译器看到方法签名要求返回 RequestInterceptor
        //public RequestInterceptor oauth2FeignRequestInterceptor()
        //
        //// 编译器看到 Lambda 表达式
        //requestTemplate -> { ... }
        //
        //// 编译器推断：这个 Lambda 表达式实现了 RequestInterceptor 接口
        //// 因为 RequestInterceptor 是函数式接口，且 Lambda 签名匹配
        //条件_>>法声明返回 RequestInterceptor
        //2. RequestInterceptor 是函数式接口（只有一个 apply 方法）
        //3. Lambda 表达式签名：requestTemplate -> { ... }
        //4. 匹配 apply(RequestTemplate requestTemplate) 方法签名
        //5. 编译器自动创建 RequestInterceptor 实现类
        return requestTemplate -> {
            // 拦截 Feign 请求，自动添加 Authorization 头
            //拦截器：拦截所有通过 Feign 发起的 HTTP 请求
            //自动添加令牌：在请求头中添加 OAuth2 令牌
            //透明传递：服务间调用时自动传递用户身份
            //Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication != null && authentication.getCredentials() instanceof String) {
                String token = (String) authentication.getCredentials();
                requestTemplate.header("Authorization", "Bearer " + token);
            }
        };
    }
}
